import requests
from django.http import JsonResponse
from django.views import View
from QQLoginTool.QQtool import OAuthQQ
from django.contrib.auth import login

from apps.oauth.models import OauthQQUser
from meiduo_mall import settings

"""
生成用户绑定链接
前端： 当用户点击QQ图标后，前端发送一个axios请求

后端： 请求 
      业务逻辑      调用QQLoginTool 生成跳转链接
      响应         返回跳转链接{'code': 0, 'qq_login_url': 'http://xxx'}
      路由         GET qq/authorization/
      步骤         1. 生成QQLoginTool实例
                  2. 调用对象的方法生成链接
                  3. 返回相应
"""

class OauthQQView(View):
    def get(self, request):
        code = request.GET.get('code')
        if code is None:
            return JsonResponse({'code': 400, 'errmsg': '参数不全'})

        qq = OAuthQQ(client_id=settings.QQ_CLIENT_ID, client_secret=settings.QQ_CLIENT_SECRET,
                        redirect_uri=settings.QQ_REDIRECT_URI, state="xxxx")
        # code -> token -> openid --- 唯一标识符
        token = qq.get_access_token(code)
        openid = qq.get_open_id(token)
        # 根据openid进行查询判断
        try:
            qquser = OauthQQUser.objects.get(openid=openid)
        except OauthQQUser.DoesNotExist as e:
            # 没有绑定过 告诉前端需要绑定
            response = JsonResponse({'code': 400, 'access_token': openid})
        else:
            # 存在
            login(request, qquser.user)
            response = JsonResponse({'code': 0, 'errmsg': 'ok'})
        return response

class QQLoginURLView(View):
    """
    提供QQ登录扫码页面
    QQ互联的回调地址是www.meiduo.site，所以需要修改本机host，指定www.meiduo.site到127.0.0.1
    """

    """提供QQ登录页面网址
    https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=xxx&redirect_uri=xxx&state=xxx
    """

    def get(self, request):
        # next表示从哪个页面进入到的登录页面，将来登录成功后，就自动回到那个页面
        next = request.GET.get('next')

        # 创建工具对象
        oauth = OAuthQQ(client_id=settings.QQ_CLIENT_ID, client_secret=settings.QQ_CLIENT_SECRET,
                        redirect_uri=settings.QQ_REDIRECT_URI, state="xxx")
        # 生成QQ登录扫码链接地址
        login_url = oauth.get_qq_url()

        return JsonResponse({'code': 0, 'errmsg': 'OK', 'login_url': login_url})
